generate_reactions.js ➔ elementsFromHalf   C
last analyzed

Complexity

Conditions 8
Paths 19

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
nc 19
dl 0
loc 23
rs 6.1403
c 0
b 0
f 0
nop 3
1
/* eslint-env node */
2
/*jslint node: true */
3
'use strict';
4
5
let jsonfile = require('jsonfile');
6
let parser = require('molecular-parser');
7
8
let resources = jsonfile.readFileSync('build/data/resources.json');
9
let elements = jsonfile.readFileSync('build/data/elements.json');
10
11
for (let element in elements) {
12
  elements[element].reactions = elements[element].reactions || [];
13
}
14
15
let lineReader = require('readline').createInterface({
16
  input: require('fs').createReadStream('build/data/raw_reactions.txt')
17
});
18
19
let reactions = {};
20
// for each reaction
21
lineReader.on('line', function (line) {
22
  let reaction = parseReaction(line);
23
  let key = generateKey(reaction);
24
  reactions[key] = {};
25
  reactions[key].reactant = vectorToMap(reaction[0]);
26
  reactions[key].product = vectorToMap(reaction[1]);
27
  extractElements(reactions[key], key);
28
});
29
30
lineReader.on('close', function () {
31
  jsonfile.writeFileSync('build/data/resources.json', resources, {
32
    spaces: 2
33
  });
34
  jsonfile.writeFileSync('build/data/elements.json', elements, {
35
    spaces: 2
36
  });
37
  jsonfile.writeFileSync('build/data/reactions.json', reactions, {
38
    spaces: 2
39
  });
40
});
41
42
function vectorToMap(vector){
43
  let map = {};
44
  for(let i in vector){
45
    let resource = vector[i];
46
    if(typeof elements[resource] !== 'undefined'){
47
      resource = elements[resource].main;
48
    }
49
    map[resource] = map[resource]+1 || 1;
50
  }
51
  return map;
52
}
53
54
function extractElements(reaction, key) {
55
  reaction.elements = [];
56
  elementsFromHalf(reaction.reactant, reaction.elements, key);
57
  elementsFromHalf(reaction.product, reaction.elements, key);
58
}
59
60
function elementsFromHalf(half, reactElements, key){
61
  for (let molecule in half) {
62
    let breakdown = parser.decomposeFormula(molecule);
63
  	if (!resources[molecule] && !elements[molecule]) {
64
        resources[molecule] = {};
65
        resources[molecule].elements = breakdown;
66
        resources[molecule].html = generateHTML(breakdown);
67
        resources[molecule].type = ['molecule'];
68
      }
69
    for (let j in breakdown) {
70
      // we add the elements involved in both parts
71
      if (reactElements.indexOf(j) === -1) {
72
        reactElements.push(j);
73
      }
74
      if (elements[j].includes.indexOf(molecule) === -1) {
75
        elements[j].includes.push(molecule);
76
      }
77
      if (elements[j].reactions.indexOf(key) === -1) {
78
        elements[j].reactions.push(key);
79
      }
80
    }
81
  }
82
}
83
84
function generateKey(reaction) {
85
  let key = '';
86
  for (let half in reaction) {
87
    for (let i in reaction[half]) {
88
      key += reaction[half][i] + '.';
89
    }
90
    key = key.replace(/.$/, '');
91
    key += '-';
92
  }
93
  key = key.replace(/-$/, '');
94
  return key;
95
}
96
97
function parseReaction(line) {
98
  let part = line.split('->');
99
  let reaction = [];
100
  for (let i in part) {
101
    reaction[i] = part[i].trim().split(' ').sort();
102
  }
103
  return reaction;
104
}
105
106
function generateHTML(breakdown){
107
  let html = '';
108
  for (let k in breakdown) {
109
    html += k;
110
    let number = breakdown[k];
111
    if(number > 1){
112
      html += '<sub>'+number+'</sub>';
113
    }
114
  }
115
  return html;
116
}
117